// 组合两数只和 40
// candidates = [10,1,2,7,6,1,5], target = 8, 总数相加为8

// 前提条件 元素不重复  元素可以无限用
function candidate(arr, target) {
    let len = arr.length;
    let result = [];
    let temp = [];
    arr.sort((a, b) => a - b)
    function back(temp, target, start) {
        if (target == 0) {
            result.push(temp)
            return
        }
        for (let i = start; i < arr.length; i++) { // 枚举当前可选的数，从start开始
            if (target < arr[i]) break
            temp.push(arr[i]);          // 选这个数
            back(temp.slice(), target - arr[i], i); // 基于此继续选择，传i，下一次就不会选到i左边的数
            temp.pop();   // 这就是回溯 撤销选择，回到选择candidates[i]之前的状态，继续尝试选同层右边的数
        }
    }
    back(temp, target, 0)
    return result
}
console.log("求和", candidate([2, 3, 6, 7], 8))
// https://pic.leetcode-cn.com/1599606793-laurLe-image.png